home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / mint / toswinsc.zoo / winops.c < prev    next >
C/C++ Source or Header  |  1992-10-27  |  17KB  |  769 lines

  1. /*
  2.  * Copyright 1992 Eric R. Smith. All rights reserved.
  3.  * Redistribution is permitted only if the distribution
  4.  * is not for profit, and only if all documentation
  5.  * (including, in particular, the file "copying")
  6.  * is included in the distribution in unmodified form.
  7.  * THIS PROGRAM COMES WITH ABSOLUTELY NO WARRANTY, NOT
  8.  * EVEN THE IMPLIED WARRANTIES OF MERCHANTIBILITY OR
  9.  * FITNESS FOR A PARTICULAR PURPOSE. USE AT YOUR OWN
  10.  * RISK.
  11.  */
  12. #include "xgem.h"
  13. #include <osbind.h>
  14. #include <mintbind.h>
  15. #include <fcntl.h>
  16. #include <signal.h>
  17. #include <string.h>
  18. #include <unistd.h>
  19. #include <stdlib.h>
  20. #include <time.h>
  21. #include "toswin.h"
  22. #include "twdefs.h"
  23. #include "twproto.h"
  24.  
  25. #define FLASHTIME 30
  26.  
  27. /* external flag: set to indicate the flag for opening a
  28.  * "global" file (if we need to) when we're starting up
  29.  */
  30. extern int global_flag;
  31.  
  32. /* file descriptors that have kids attached to them */
  33. long fd_mask = 0L;
  34.  
  35. /* file descriptor of TOSRUN */
  36. extern int trun_fd;
  37.  
  38. static void write_win __PROTO((TEXTWIN *, char *, int));
  39.  
  40. /*
  41.  * get a file name using the file selector.
  42.  * "title" is the file selector box title
  43.  * "path" is where to look for the file;
  44.  * "default_name" is a default name for the file;
  45.  * the final name selected is returned in "name"
  46.  */
  47.  
  48. int
  49. getfilename(title, name, path, default_name)
  50.     char *title;
  51.     char *name;
  52.     char *path, *default_name;
  53. {
  54.     extern char *rindex();
  55.     char *s;
  56.     int fresult, fbutton;
  57.     extern int gl_ap_version;
  58.  
  59.     if (path[0] == 0) {
  60.         path[0] = Dgetdrv() + 'A';
  61.         path[1] = ':';
  62.         (void)Dgetpath(&path[2], 0);
  63.         strcat(path, "\\");
  64.     }
  65.     for (s = path; *s; s++) {
  66.         if (*s == '*') goto nowildcard;
  67.     }
  68.     strcpy(s, "*.*");
  69.  
  70. nowildcard:
  71.     if (gl_ap_version >= 0x140)
  72.         fresult = fsel_exinput(path, default_name, &fbutton, title);
  73.     else
  74.         fresult = fsel_input(path, default_name, &fbutton);
  75.     if (fresult <= 0 || fbutton != 1 || !default_name[0])
  76.         return FAIL;
  77.     s = rindex(path, '\\');
  78.     if (!s)
  79.         s = &path[2];
  80.     else
  81.         s++;
  82.     *s = 0;
  83.     strcpy(name, path);
  84.     strcat(name, default_name);
  85.     return OK;
  86. }
  87.  
  88. /*
  89.  * if the program named by "fname" is a .TTP one, prompt the
  90.  * user for arguments and copy them into "argstr"; otherwise
  91.  * copy in a null command line. Return FAIL if the user
  92.  * cancelled the request.
  93.  */
  94.  
  95. int
  96. getargs(fname, argstr)
  97.     char *fname, *argstr;
  98. {
  99.     char *lastdot = 0;
  100.     int i, x, y, w, h;
  101.     TEDINFO *ted;
  102.     OBJECT *argdial;
  103.     char *inp;
  104.  
  105.     *argstr = 0;
  106.     while (*fname) {
  107.         if (*fname == '.')
  108.             lastdot = fname;
  109.         else if (*fname == '\\')
  110.             lastdot = 0;
  111.         fname++;
  112.     }
  113.     if (lastdot && !strcmp(lastdot, ".TTP")) {
  114.         rsrc_gaddr(0, ARGDIAL, &argdial);
  115.         ted = (TEDINFO *)argdial[ARGSTR].ob_spec;
  116.         inp = (char *)ted->te_ptext;
  117.         *inp = 0;
  118.         form_center(argdial, &x, &y, &w, &h);
  119.         wind_update(1);
  120.         form_dial(FMD_START, 0, 0, 32, 32, x, y, w, h);
  121.         if (win_flourishes)
  122.             form_dial(FMD_GROW, 0, 0, 32, 32, x, y, w, h);
  123.  
  124.         objc_draw(argdial, 0, 2, x, y, w, h);
  125.  
  126.         i = form_do(argdial, ARGSTR);
  127.  
  128.         if (win_flourishes)
  129.             form_dial(FMD_SHRINK, 0, 0, 32, 32, x, y, w, h);
  130.  
  131.         form_dial(FMD_FINISH, 0, 0, 32, 32, x, y, w, h);
  132.         objc_change(argdial, i, 0, x, y, w, h, NORMAL, 0);
  133.         wind_update(0);
  134.         if (i == ARGCAN) return FAIL;
  135.         strcpy(argstr, inp);
  136.     }
  137.     return OK;
  138. }
  139.  
  140. char progpath[128];
  141. char dfltprog[128];
  142.  
  143. int
  144. getprogname(name)
  145.     char *name;
  146. {
  147.     return getfilename(Strng(EXECPRG), name, progpath, dfltprog);
  148. }
  149.  
  150. /*
  151.  * typeit: type the user's input into a window. Note that this routine is
  152.  * called when doing a 'paste' operation, so we must watch out for possible
  153.  * deadlock conditions
  154.  */
  155.  
  156. #define READBUFSIZ 256
  157. static char buf[READBUFSIZ];
  158.  
  159. int
  160. typeit(w, code, shift)
  161.     WINDOW *w;
  162.     int code, shift;
  163. {
  164.     TEXTWIN *t = w->extra;
  165.     long offset, height;
  166.     long c = (code & 0x00ff) | (((long)code & 0x0000ff00) << 8L) |
  167.          ((long)shift << 24L);
  168.     long r;
  169.     if (t->miny) {
  170.         offset = t->miny * t->cheight;
  171.         if (offset > t->offy) {
  172.     /* we were looking at scroll back */
  173.     /* now move so the cursor is visible */
  174.             height = t->cheight * t->maxy - w->wi_h;
  175.             if (height <= 0)
  176.                 offset = 0;
  177.             else {
  178.                 offset = 1000L * t->cy * t->cheight/height;
  179.                 if (offset > 1000L) offset = 1000L;
  180.             }
  181.             (*w->vslid)(w, offset);
  182.         }
  183.     }
  184.  
  185.     if (t->fd) {
  186.         r = Foutstat(t->fd);
  187.         if (r <= 0) {
  188.             r = Fread(t->fd, (long)READBUFSIZ, buf);
  189.             if (r > 0) {
  190.                 write_win(t, buf, (int)r);
  191.             }
  192.             (void)Fselect(500,0L,0L,0L);
  193.             r = Foutstat(t->fd);
  194.         }
  195.         if (r > 0) {
  196.             (void)Fputchar(t->fd, c, 0);
  197.             return 1;
  198.         }
  199.     }
  200.     return 0;
  201. }
  202.  
  203. void (*oldtopped)(), (*oldclosed)();
  204.  
  205. extern MENU *sysbar;
  206. extern int appl_menus, sys_menu;
  207.  
  208. void
  209. top_menu(v, f)
  210.     WINDOW *v;
  211.     void (*f)();
  212. {
  213.     ENTRY *e;
  214.     TEXTWIN *t = v->extra;
  215.     TEXTWIN *oldt;
  216.     int enable = (v->wtype == TEXT_WIN);
  217.  
  218.     if (gl_topwin && gl_topwin->wtype == TEXT_WIN &&
  219.         gl_topwin->extra != t)
  220.         oldt = gl_topwin->extra;
  221.     else
  222.         oldt = 0;
  223.  
  224.     for (e = windowmenu->contents; e; e = e->next) {
  225.         if (e->entry[0] != '-')
  226.             if (enable)
  227.                 enable_entry(windowmenu, e);
  228.             else
  229.                 disable_entry(windowmenu, e);
  230.     }
  231.     for (e = gadgmenu->contents; e; e = e->next) {
  232.         if (e->entry[0] != '-')
  233.             if (enable)
  234.                 enable_entry(gadgmenu, e);
  235.             else
  236.                 disable_entry(gadgmenu, e);
  237.     }
  238.  
  239.     enable_entry(filemenu, closeentry);
  240.  
  241. #ifdef GLOBL_APPL_MENUS
  242.     if (v->menu && appl_menus) {
  243.         show_menu(v->menu);
  244.         sys_menu = 0;
  245.     } else if (!sys_menu) {
  246.         show_menu(sysbar);
  247.         sys_menu = 1;
  248.     }
  249. #endif
  250.     if (enable)
  251.         curs_off(t);
  252.     if (oldt) {
  253.     /* change the cursor states, maybe */
  254.         curs_off(oldt);
  255.     }
  256.     (*f)(v);
  257.     focuswin = gl_topwin;
  258.     if (enable) {
  259.         curs_on(t);
  260.         refresh_textwin(t);
  261.     }
  262.     if (oldt) {
  263.         curs_on(oldt);
  264.         refresh_textwin(oldt);
  265.     }
  266. }
  267.  
  268. static void
  269. top_text(v)
  270.     WINDOW *v;
  271. {
  272.     top_menu(v, oldtopped);
  273. }
  274.  
  275. static void
  276. desk_menu(v)
  277.     WINDOW *v;
  278. {
  279.     ENTRY *e;
  280.  
  281.     (*oldclosed)(v);
  282.     if (v->menu)
  283.         unloadmenu(v->menu);
  284.     if (!gl_topwin) {
  285.         for (e = windowmenu->contents; e; e = e->next) {
  286.             if (e->entry[0] != '-')
  287.                 disable_entry(windowmenu, e);
  288.         }
  289.         for (e = gadgmenu->contents; e; e = e->next) {
  290.             if (e->entry[0] != '-')
  291.                 disable_entry(gadgmenu, e);
  292.         }
  293.         disable_entry(filemenu, closeentry);
  294. #ifdef GLOBAL_APPL_MENUS
  295.         if (!sys_menu) {
  296.             show_menu(sysbar);
  297.             sys_menu = 1;
  298.         }
  299. #endif
  300.     }
  301. }
  302.  
  303. /*
  304.  * set up a new text window with a process running in it
  305.  * "progname" is the program's name;
  306.  * "progargs" are the arguments for it;
  307.  * "progdir" is the directory to change to;
  308.  * "x" and "y" give where the window is to be opened
  309.  * "rows" and "cols" are the number of rows and columns for it,
  310.  * respectively;
  311.  * "scroll" are the number of lines of scrollback to be
  312.  * alloted for the window
  313.  *
  314.  * NOTE: the window is *not* actually opened here; it's the
  315.  * caller's responsibility to do that.
  316.  */
  317.  
  318. TEXTWIN *
  319. newproc(progname, progargs, progdir, x, y, cols, rows, scroll, kind,
  320.  font, points)
  321.     char *progname, *progargs, *progdir;
  322.     int x, y, cols, rows, kind, scroll, font, points;
  323. {
  324.     extern void vt52_putch();
  325.     extern long termfunc;    /* set in main.c */
  326.     TEXTWIN *t;
  327.     int i, ourfd, kidfd;
  328. #ifdef OLD_WAY
  329.     long oldblock;
  330. #else
  331.     long r;
  332. #endif
  333.     static char termname[64];
  334.     static char argbuf[128];
  335.     struct winsize tw;
  336.     char *p, *arg, c;
  337.     char *newenv = 0;
  338.     int oldfont, oldheight;
  339.  
  340.     /* copy over the args */
  341.     p = argbuf+1;
  342.     arg = progargs;
  343.     for (i = 0; i < 125; i++) {
  344.         c = *arg++;
  345.         if (!c || c == '\r' || c == '\n') break;
  346.         *p++ = c;
  347.     }
  348.     *p = 0;
  349.     argbuf[0] = i;
  350.  
  351.     oldfont = default_font;
  352.     oldheight = default_height;
  353.     default_font = font;
  354.     default_height = points;
  355.     t = create_textwin(progname, x, y, cols, rows, scroll, kind);
  356.     default_font = oldfont;
  357.     default_height = oldheight;
  358.  
  359.     if (!t) {
  360.         form_alert(1, AlertStrng(NOWINS));
  361.         return 0;
  362.     }
  363.     t->output = vt52_putch;
  364.     t->prog = strdup(progname);
  365.     t->cmdlin = strdup(progargs);
  366.     t->progdir = strdup(progdir);
  367.     t->win->menu = loadmenu(progname);
  368.     if (t->win->menu) {
  369.         t->win->infostr = strdup(menustr(t->win->menu));